package com.tff.gmall.cart.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.tff.gmall.RedisUtil;
import com.tff.gmall.beans.OmsCartItem;
import com.tff.gmall.cart.mapper.OmsCartItemMapper;
import com.tff.gmall.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Fafa Tuo
 * @version 1.0
 * @date 2021/7/6 21:38
 */
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private OmsCartItemMapper omsCartItemMapper;


    private RedisUtil redisUtil = new RedisUtil();

    @Override
    public OmsCartItem ifCartExitsByUser(String memberId, String skuId) {
        return omsCartItemMapper.ifCartExitsByUser(memberId, skuId);
    }

    @Override
    public void addToCart(OmsCartItem omsCartItem) {
        int i = omsCartItemMapper.addToCart(omsCartItem);
        System.out.println(i > 0 ? "加入购物车成功" : "加入购物车失败");
    }

    @Override
    public void updateToCart(OmsCartItem omsCartItemFromDb) {
        int i = omsCartItemMapper.updateToCart(omsCartItemFromDb);
        System.out.println("i = " + i);
        System.out.println(i > 0 ? "更新购物车成功" : "更新购物车失败");
    }

    @Override
    public void flushCartCache(String memberId) {
        //根据用户id拿到购物车数据
        List<OmsCartItem> omsCartItems = omsCartItemMapper.getOmsCartItemByMemberId(memberId);

        //同步到redis中
        Jedis redis = redisUtil.getRedis();
        Map<String, String> map = new HashMap<>();
        for (OmsCartItem omsCartItem : omsCartItems) {
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(new BigDecimal(omsCartItem.getQuantity())));
            map.put(omsCartItem.getProductSkuId(), JSON.toJSONString(omsCartItem));
        }

        redis.del("user:" + memberId + ":cart");
        redis.hmset("user:" + memberId + ":cart", map);

        //释放redis连接
        redis.close();
    }

    @Override
    public List<OmsCartItem> getCartList(String memberId) {

        List<OmsCartItem> omsCartItems = new ArrayList<>();
        Jedis redis = null;
        try {
            redis = redisUtil.getRedis();
            List<String> hvals = redis.hvals("user:" + memberId + ":cart");
            for (String hval : hvals) {
                OmsCartItem omsCartItem = JSON.parseObject(hval, OmsCartItem.class);
                omsCartItems.add(omsCartItem);
            }

        } catch (Exception e) {
            //处理异常逻辑
            e.printStackTrace();
            return null;
        } finally {
            redis.close();
        }
        return omsCartItems;
    }

    @Override
    public void checkCart(OmsCartItem omsCartItem) {
        Integer integer = omsCartItemMapper.updateCheckCart(omsCartItem);
        System.out.println("integer = " + integer);

        //更新完数据库以后同步缓存
        flushCartCache(omsCartItem.getMemberId());
    }
}
